package es.uned.etsii.si3.taller.servlets;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.struts2.interceptor.SessionAware;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.Cliente;
import es.uned.etsii.si3.taller.EmpleadoTaller;
import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.ParteTrabajo;
import es.uned.etsii.si3.taller.Taller;
import es.uned.etsii.si3.taller.Usuario;
import es.uned.etsii.si3.taller.Vehiculo;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;

public class PTPresupuestos extends ActionSupport implements SessionAware {

	private static final long serialVersionUID = 1L;
	
	private 	Map<String, Object>		userSession;

	/**
	private 	BigDecimal 				precioPresupuesto;
	public 		BigDecimal 				getPrecioPresupuesto() 					{ return this.precioPresupuesto; }
	public 		void 					setPrecioPresupuesto(BigDecimal d) 		{ this.precioPresupuesto = d; }
	**/
	private 	String	 				precioPresupuesto;
	public 		String					getPrecioPresupuesto() 					{ return this.precioPresupuesto; }
	public 		void 					setPrecioPresupuesto(String s) 			{ this.precioPresupuesto = s; }
	
	private 	String					referencia;
	public 		String 					getReferencia() 						{ return this.referencia; }
	public 		void 					setReferencia(String s)					{ this.referencia = s; }
	
	
	//private 	Date 					fechaEstimada;
	//public 		Date 					getFechaEstimada() 						{ return this.fechaEstimada; }
	//public 		void 					setFechaEstimada(Date d) 				{ this.fechaEstimada = d; }
	private 	String					fechaEstimadaString;
	public		String					getFechaEstimadaString()				{ return this.fechaEstimadaString; }
	public 		void					setFechaEstimadaString(String s)		{ this.fechaEstimadaString = s; }
		
	private 	ParteTrabajo			parteSeleccionado = null;
	public 		ParteTrabajo			getParteSeleccionado() 					{ return this.parteSeleccionado; }
	public 		void					setParteSeleccionado(ParteTrabajo pT) 	{ this.parteSeleccionado = pT; }

	private 	static int 				parteSeleccionadoID = -1;
	public 		int						getParteSeleccionadoID() 				{ return PTPresupuestos.parteSeleccionadoID; }
	public 		void					setParteSeleccionadoID(int i) 			{ PTPresupuestos.parteSeleccionadoID = i; }

	private 	List<ParteTrabajo>		listaPartes;		
	public		List<ParteTrabajo>		getListaPartes() 						{ return this.listaPartes; }
	public 		void					setListaPartes(List<ParteTrabajo> l)	{ this.listaPartes = l; }
	
	
	/**
	 * Obtiene la lista de partes no presupuestados
	 * @return  actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_PARTES_SIN_PRESUPUESTAR)	
	public String pTNOPresupuestados() throws SQLException {
		String res = SUCCESS;
		QueryBuilder<ParteTrabajo, Integer> parteQb = FactoriaDAO.getDao(ParteTrabajo.class).queryBuilder();
		Where<ParteTrabajo, Integer> wParteQb = parteQb.where();
		wParteQb.eq(ParteTrabajo.ID_TALLER_FIELD_NAME, this.getTallerSesionEmpleado());
		wParteQb.and().isNull(ParteTrabajo.PRECIOPRESUPUESTO_FIELD_NAME);
			
		QueryBuilder<Usuario, Integer> usuariosQb = FactoriaDAO.getDao(Usuario.class).queryBuilder();
		QueryBuilder<Cliente, Integer> clientesQb = FactoriaDAO.getDao(Cliente.class).queryBuilder();
		QueryBuilder<Vehiculo, Integer> vehiculosQb = FactoriaDAO.getDao(Vehiculo.class).queryBuilder();
		List<ParteTrabajo> lista = parteQb.join((usuariosQb).join(clientesQb)).join(vehiculosQb).query(); //.orderBy(ParteTrabajo.FECHAENTRADA_FIELD_NAME, true).query();			
		this.setListaPartes(lista);
		return res;
	}
	
	/**
	 * Permite presupuestar el parte 
	 * @return  actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_PARTES_SIN_PRESUPUESTAR)	
	public String pTPresupuestar() throws SQLException {
		String res = SUCCESS;		
		this.setParteSeleccionadoID(this.getParteSeleccionadoID());
		this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getParteSeleccionadoID()));
		if ( this.getReferencia().isEmpty() ) {
			addActionError("Faltan la referencia");
			res = ERROR;
		}
		if ( this.getPrecioPresupuesto() == null ) {
			addActionError("Falta el precio");
			res = ERROR;		
		} else {
			if ( !testBigDecimal(this.getPrecioPresupuesto()) ) {
				addActionError("El precio no es correcto");				
				res = ERROR;								
			}
		}
		if ( this.getFechaEstimadaString().isEmpty() ) {
			addActionError("Faltan la fecha estimada de finalizacion");
			res = ERROR;
		}
		if ( res == SUCCESS ) {
			this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getParteSeleccionadoID()));
			this.parteSeleccionado.setTaller(this.getTallerSesionEmpleado());
			this.parteSeleccionado.setReferencia(this.getReferencia());
			//this.parteSeleccionado.setPrecioPresupuesto(this.getPrecioPresupuesto());
			this.parteSeleccionado.setPrecioPresupuesto(new BigDecimal(this.getPrecioPresupuesto()).setScale(2));
			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
			this.parteSeleccionado.setTaller(this.getTallerSesionEmpleado());						
			try {
				this.parteSeleccionado.setFechaEstimada(df.parse(this.getFechaEstimadaString()));
			} catch (ParseException e) {
				addActionError("Formato de la fecha erróneo");
				res = ERROR;
			}
			this.parteSeleccionado.update();
		}
		return res;
	}
	
	
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_TALLER_PARTES_SIN_PRESUPUESTAR)	
	public String pTPostNOPresupuestados() throws SQLException {
		String res = SUCCESS;		
		this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getParteSeleccionadoID()));		
		return res;
	}

	
	private Taller getTallerSesionEmpleado() {
		Taller res = null;
		Usuario uS = (Usuario) userSession.get("usuario");
		QueryBuilder<EmpleadoTaller, Integer> eTQb;
		try {
			eTQb = FactoriaDAO.getDao(EmpleadoTaller.class).queryBuilder();
			Where<EmpleadoTaller, Integer> wETQb = eTQb.where();			
			wETQb.eq(EmpleadoTaller.ID_USUARIO_FIELD_NAME, uS.getId());			
			List<EmpleadoTaller> lista = wETQb.query();
			res = lista.get(0).getTaller();
		} catch (SQLException e) {
			addActionError("Error al buscar taller: " + e);
		}			
		return res;
	}

	private boolean testBigDecimal(String t) {
		Pattern pattern;
		pattern = Pattern.compile("\\d+(?:\\.\\d{1,2})?|(?:\\d+)?\\.\\d{1,2}|\\d+(?:\\.)");
		
		if (pattern.matcher(t).matches())
			return true;
		else
			return false;
	}
	
	
	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;		
	}

}
